<?php

/**
 * Controller.php
 * 
 * workPHP控制器基类 
 * @author wang <wang@fvzone.com>
 * @copyright  Copyright (c) 2010 Fire vision Software Studio
 * @link http://www.fvzone.com
 * @license New BSD License.{@link http://www.opensource.org/licenses/bsd-license.php}
 * @version $Id: Controller.php 1.1 2011-8-12 22:48:01Z wang $
 * @package core
 * @since 1.0
 */

defined('IN_WORK') or exit('Authorization error');

abstract class Controller extends Work
{
    /**
     * @var View 视图实例
     */
    protected $view;

    /**
	 * 控制器前函数，调用具体方法前执行
	 *
	 */
    abstract public function before();

	/**
	 * 获取或设置HTTP查询字符串,注意此变量经过xss过滤的
	 *
	 * @param   mixed   $key    获取$_GET值的键
	 * @param   string  $value  在没有获取到数据的时候返回默认值
	 * @return  mixed
	 */
	public function get($key = null, $default = null)
	{
		if (!empty(Request::$get[$key])) 
        {
			return Request::$get[$key];
		}
        return $default == null ? Request::$get : $default;
	}

	/**
	 * 获取或设置[$_POST]查询字符串,注意此变量经过xss过滤的
	 *
	 * @param   mixed   $key    获取$_POST值的键
	 * @param   string  $value  在没有获取到数据的时候返回默认值
	 * @return  mixed
	 */
	public function post($key = null, $default = null)
	{
		if (!empty(Request::$post[$key]))
        {
			return Request::$post[$key];
		}
        return $default == null ? Request::$post : $default;
	}

	/**
	 * 分析视图文件
	 * 
	 * 获取视图的路径,便于程序进行include操作. 注:本方法不支持视图布局结构(layout)
	 * @param string $file_name 视图文件名，注:名称中不带.php后缀。
	 * @return void
	 *
	 */
	public function template($name = null)
    {
		//已经没有指定就使用默认值
		if (is_null($name))
        {
			$filename = Request::controller() . DS . Request::action();
		}
        else
        {
			$filename = (strpos($name, '/') !== false) ? $name : Request::controller() . DS . $name;
		}
        $filename .= '.php';
		
        //当前组件里找视图文件
        $view_file = COMPONENT_DIR. Request::component() .'/views/'. $filename;
        if (!is_file($view_file))
        {
            $view_file = (!empty($this->view->theme) ? APP_DIR . 'themes/'. $this->view->theme. DS : PUBLIC_DIR .'views'. DS). $filename;
            //视图文件不存在
		    if (!is_file($view_file))
			    throwException('The view file:' . $view_file . ' Not found!');
        }
		return $view_file;
	}

    /**
     * 显示提示信息操作
     * 
     * 所显示的提示信息并非完全是错误信息。如：用户登陆时用户名或密码错误，可用本方法输出提示信息
     * 
     * @param string $message 		所要显示的提示信息
     * @param string $goto_url 		所要跳转的自定义网址
     * @param string $target 		打开目标,注:支持 _self、_top、_parent
     * @param int    $limit_time 	显示信息的有效期,注:(单位:秒) 默认为5秒
     * @return void
     */
    public function alert($message, $gurl = null, $target = '_self', $ltime = 3)
    {
        //当自定义跳转网址存在时
        if($gurl != null)
        {
            if($target == '_parent' || $target == '_top' || $target == '_self')
                $target = str_replace('_', '.', $target);
            else
                return false;

            $ltime = $ltime  * 1000;

            //分析自定义网址是否为返回页
            if($gurl == -1)
            {
                $gurl = "javascript:history.go(-1);";
                $html = "<a href='javascript:history.go(-1);' target='_self'>如果你的浏览器没反应,请点击这里</a>";
            } 
            else
            {
                $html = "<a href='{$gurl}' target='{$target}'>如果你的浏览器没反应,请点击这里</a>";
            }
            $html .= "<script type='text/javascript'>function redirect(url) { window{$target}.location.href=url; } setTimeout('redirect(\"{$gurl}\")',{$ltime});</script>";
        }
        $message_template_file = PUBLIC_DIR . 'views/error/alert.tpl.php';
        is_file($message_template_file) ? include_once $message_template_file : include_once WORK_DIR . 'assets/views/alert.tpl.php';
        exit;
    }

    /**
     * 优雅输出print_r()函数所要输出的内容
     * 
     * 用于程序调试时,完美输出调试数据,功能相当于print_r().当第二参数为true时(默认为:false),功能相当于var_dump()。
     * 注:本方法一般用于程序调试
     * @param array $data 		所要输出的数据
     * @param boolean $option 	选项:true或 false
     * @return array			所要输出的数组内容
     */
    function dump($data, $option = false) 
    {
        //当输出print_r()内容时
        if (!$option) 
        {
            echo '<pre>';
            print_r($data);
            echo '</pre>';

        } 
        else 
        {
            ob_start();
            var_dump($data);
            $output = ob_get_clean();
            
            $output = str_replace('"', '', $output);
            $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output);
            
            echo '<pre>', $output, '</pre>';
        }
        exit;
    }

	/**
	 * Ajax调用返回
	 * 
	 * 返回json数据,供前台ajax调用
	 * @param array $data	返回数组,支持数组
	 * @param string $info	返回信息, 默认为空
	 * @param boolean $status	执行状态, 1为true, 0为false
	 * @return string
	 */
	public function ajaxReturn($info = null, $status = 1, $data = array())
    {
		$result 			= array();
		$result['status'] 	= $status;
		$result['info']		= (!is_null($info)) ? $info : '';
		$result['data']		= $data;
		
		header("Content-Type:text/html; charset=utf-8");
        exit(json_encode($result));
	}

    /**
     * 网址(URL)跳转操作
     * 
     * 页面跳转方法，例:运行页面跳转到自定义的网址(即:URL重定向)
     * @access public
     * @param string $url 所要跳转的URL
     * @return void
     */
    public function redirect($url)
    {     
        if (!headers_sent())
        {
            header("Location:".$url);
        } 
        else 
        {
            echo '<script type="text/javascript">location.href="'. $url . '";</script>';
        }
        exit();
    }
}